///********************************************************************
///* Copyright © 2011 fishr (fishr.flash@gmail.com)  
///********************************************************************
package su.fishr.effects.prismavision.views 
{
	import flash.display.Bitmap;
	import flash.display.BitmapData;
	import flash.display.DisplayObject;
	import flash.display.Shape;
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.filters.BlurFilter;
	import flash.geom.ColorTransform;
	import flash.geom.Matrix;
	
	
   /**
	 *  Наименьший и основной, элементарный, визуальный объект приложения.
	 *	Представляющий собой одну призму.
	 *	Выполняет смену фрагментов изображения имитируя работу призмы билборда.
	 *  Может выполнять смену слева-направо и справа-налево, снизу-вверх и сверху-вниз.
	 *
	 * @version                1.0
	 * @playerversion          Flash 9
	 * @langversion            3.0
	 * @author                 fishr
	 * @created                06.08.2011 20:03
	 * @since                  06.08.2011 20:03
	 */
    internal class Prisma extends Sprite
	{
	
	/**-------------------------------------------------------------------------------
	* 
	*	   						V A R I A B L E ' S 	
	* 
	* --------------------------------------------------------------------------------
	*/
	//{
	    static public const AUTHOR:String = "fishr (fishr.flash@gmail.com)";	
		static public const ROTATION_STOP:String = "rotationStop";
		private var _secPict:Bitmap;
		private var _secMask:Bitmap;
		private var _prevCont:Sprite;
		private var _secCont:Sprite;
		private var _widthPrisma:Number;
		private var _endRotate:Boolean = false;
		private var _heightPrisma:Number;
		private var _nmParams:int;
		private var _vertical:Boolean;
		private var _rotatParams:Array;
		
		
		
	//}
	
	/**-------------------------------------------------------------------------------
	* 
	*	 						P R O P E R T I E S 	
	* 
	* --------------------------------------------------------------------------------
	*/
	//{

		
		public function set secMask(value:Bitmap):void 
		{
			_secMask = value;
		}
		
		public function set endRotate(value:Boolean):void 
		{
			_endRotate = value;
		}
		
		public function get widthPrisma():Number 
		{
			return _widthPrisma;
		}
		
		public function get heightPrisma():Number 
		{
			return _heightPrisma;
		}
		
		public function get prevCont():Sprite 
		{
			return _prevCont;
		}
		
		public function get secCont():Sprite 
		{
			return _secCont;
		}
		
		public function get nmParams():int 
		{
			return _nmParams;
		}
		
		public function get rotatParams():Array 
		{
			return _rotatParams;
		}
		
		
		
	//}
	/**-------------------------------------------------------------------------------
	* 
	*								P U B L I C 	
	* 
	* --------------------------------------------------------------------------------
	*/
	//{
		public function Prisma(obj:Bitmap, mask:Bitmap = null)
		{
			init(obj, mask);
		}
		
				///сменяющее изображение
		public function secPict(secPict:Bitmap, secMask:Bitmap = null):void 
		{
			if ( _secCont.getChildAt( 0 ) === secPict ) return;
			_secCont.addChild( secPict );
			_secCont.removeChildAt( 0 );
		}
		
		public function rotationPrisma( rotatParams:Array, vertical:Boolean = false):void
		{
			var shape:Shape;
			var deg:int;
			_nmParams = 0;
			_rotatParams = rotatParams;
			_vertical = vertical;
			
			this.addEventListener( Event.ENTER_FRAME, enterFrameHandler);
			
		}
		
		
		
	//}
	
	/**-------------------------------------------------------------------------------
	* 
	*							P R O T E C T E D S
	* 
	* --------------------------------------------------------------------------------
	*/	
	//{
		protected function init(obj:Bitmap, mask:Bitmap = null):void
		{
			
			_widthPrisma = obj.bitmapData.width;
			_heightPrisma = obj.bitmapData.height;

			var bitmap:Bitmap = createBlank();
			_secCont = new Sprite();
			this.addChild( _secCont );
			_secCont.addChild( bitmap );

			_prevCont = new Sprite();
			this.addChild( _prevCont );
			_prevCont.addChild( obj );
			
		}
		
		protected function turnPrisma(coords:Array):void 
		{
			
			/// + .15 убирает "дрожание" стыков
			_prevCont.x = _widthPrisma * coords[0];
			_prevCont.scaleX =  coords[1];
			_secCont.scaleX = coords[3];
			_secCont.x = _widthPrisma * coords[2];

			if ( _prevCont.x > _secCont.x ) _secCont.x += .15;
			else _prevCont.x += .15;
			

			if ( _secCont.scaleX >= 0 )_secCont.visible = true;
			if ( _prevCont.scaleX <= 0 ) _prevCont.visible = false;
			if ( _endRotate ) endRotation();
		}
		
		protected function turnPrismaV(coords:Array):void 
		{
			_prevCont.y = _heightPrisma * coords[0];
			_prevCont.scaleY = coords[1];
			
			_secCont.y = _heightPrisma * coords[2];
			_secCont.scaleY = coords[3];
				
			if ( _prevCont.y > _secCont.y ) _secCont.y += .15;
			else _prevCont.y += .15;

			if ( _secCont.scaleY >= 0 )_secCont.visible = true;
			if ( _prevCont.scaleY <= 0 ) _prevCont.visible = false;
			if ( _endRotate ) endRotation();
		}
		
		protected function endRotation():void 
		{
			this.removeEventListener( Event.ENTER_FRAME, enterFrameHandler);
			_prevCont.x = _prevCont.y = 0 ;
			_prevCont.scaleX = _prevCont.scaleY = 1;
			_prevCont.visible = true;
			_secCont.visible = false;

			///переносим битмапу
			_prevCont.addChild( _secCont.getChildAt(0) );
			
			///переносим битмапу
			_secCont.addChild( _prevCont.getChildAt(0) );
			
			_endRotate = false;
			dispatchEvent( new Event( ROTATION_STOP ) );

		}
		
		protected function createBlank():Bitmap
		{
			
			var bData:BitmapData = new BitmapData( _widthPrisma, 
													_heightPrisma, 
													false, 0x00333333);
			var bitmap:Bitmap = new Bitmap( bData );
			
			return bitmap;
		}
	//}
	
	/**-------------------------------------------------------------------------------
	* 
	*								P R I V A T E 	
	* 
	* --------------------------------------------------------------------------------
	*/	
	//{

		private function enterFrameHandler(e:Event):void 
		{
			
			
			if ( _vertical === false  ) turnPrisma( _rotatParams[_nmParams] );
			else turnPrismaV( _rotatParams[_nmParams] );
			
			_nmParams++;
			
			///TODO: Расскоментить если буде глючить, но вроде второй вар. правильней.
			//if ( _nmParams === _rotatParams.length ) endRotation();
			if ( _nmParams === _rotatParams.length - 1 ) endRotation();
		}

	
	//}

	}

}